package negocio;

import controladoresJPA.IngresoJpaController;
import controladoresJPA.OperarConsumoConsumibleJpaController;
import controladoresJPA.OperarConsumoJpaController;
import controladoresJPA.OperarIngresoJpaController;
import java.math.BigDecimal;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.inject.Named;
import javax.persistence.NoResultException;
import modelo.Ingreso;
import modelo.OperarIngreso;
import modelo.Usuario;
import negocio.exception.BusinessException;

@Named("IngresoBI")
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class IngresoBI {
    @Resource
    private EJBContext eJBContext;
    
    public void crear(Ingreso ingreso) throws Exception{
        try{
            IngresoJpaController ijc = new IngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            ijc.altaIngreso(ingreso);
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("Error al crear el ingreso");
        }
    }
    
    public Double aportarMonto(Integer idIngreso,Double monto, Usuario usuario, String descripcion)throws Exception{
        try{
            IngresoJpaController ijc = new IngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            Ingreso in = ijc.findIngreso(idIngreso);
            Double capital = in.getCapital().doubleValue();
            capital += monto;
            in.setCapital(BigDecimal.valueOf(capital));
            ijc.edit(in);
            
            OperarIngresoJpaController oijc = new OperarIngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            OperarIngreso operarIngreso = new OperarIngreso();
            operarIngreso.setFechaOperacion(new Date());
            operarIngreso.setIdIngresoDestino(in);
            operarIngreso.setIdUsuario(usuario);
            operarIngreso.setMonto(BigDecimal.valueOf(monto));
            operarIngreso.setDescripcion(descripcion);
            oijc.create(operarIngreso);
            
            return capital;
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("Error al crear el ingreso");
        }
    }
    
    public Double transferirMonto(Integer idIngOrigen, Integer idIngDestino, Double monto, Usuario usuario, String descripcion)throws Exception{
        try{
            
            IngresoJpaController ijc = new IngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            Ingreso inO = ijc.findIngreso(idIngOrigen);
            Double capitalOr = inO.getCapital().doubleValue();
            if((capitalOr-monto)<0){
                throw new BusinessException("Monto insuficiente");
            }
            capitalOr -= monto;
            inO.setCapital(BigDecimal.valueOf(capitalOr));
            ijc.edit(inO);
            
            Ingreso inD = ijc.findIngreso(idIngOrigen);
            Double capitalDe = inD.getCapital().doubleValue();
            capitalDe += monto;
            inD.setCapital(BigDecimal.valueOf(capitalDe));
            ijc.edit(inD);
            
            OperarIngresoJpaController oijc = new OperarIngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            OperarIngreso operarIngreso = new OperarIngreso();
            operarIngreso.setFechaOperacion(new Date());
            operarIngreso.setIdIngresoDestino(inD);
            operarIngreso.setIdIngresoOrigen(inO);
            operarIngreso.setIdUsuario(usuario);
            operarIngreso.setMonto(BigDecimal.valueOf(monto));
            operarIngreso.setDescripcion(descripcion);
            oijc.create(operarIngreso);
            
            return capitalDe;
        }catch(BusinessException be){
            throw be;
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("Error al crear el ingreso");
        }
    }
    
    public Ingreso buscarIngresoPorIdIngreso(Integer idIngreso) throws Exception {
        try{
            IngresoJpaController ijc = new IngresoJpaController(eJBContext.getUserTransaction(), EFServicio.getEmf());
            Ingreso ingreso = ijc.findIngreso(idIngreso);
            return ingreso;
        }catch(NoResultException nre){
            return null;
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("Error al buscar el consumible");
        }
    }
}
